package com.howie.gulimall.search.thread_note;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @description:
 * @author: laizhenghua
 * @date: 2021/3/1 17:30
 */
public class TreadTest {
    /**
     * 创建线程池
     */
    public static ExecutorService executor = Executors.newFixedThreadPool(5);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 测试多任务组合
        CompletableFuture<Integer> future01 = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务1线程：" + Thread.currentThread().getName());
            int sum = 10 / 2;
            System.out.println("执行结果：" + sum);
            System.out.println("任务1线程结束");
            return sum;
        }, executor);

        CompletableFuture<String> future02 = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务2线程：" + Thread.currentThread().getName());
            System.out.println("任务2线程结束");
            return "hello";
        }, executor);

        CompletableFuture<String> futureImage = CompletableFuture.supplyAsync(() -> {
            System.out.println("查询图片地址的线程3：" + Thread.currentThread().getName());
            return "hello.jpg";
        }, executor);

        CompletableFuture<String> futureAttr = CompletableFuture.supplyAsync(() -> {
            System.out.println("查询图片属性的线4：" + Thread.currentThread().getName());
            return "上市年份";
        }, executor);

        // 多任务组合方式1：使用get()方法阻塞式等待
        /*
        future01.get();
        future02.get();
        futureImage.get();
        ...
        弊端：相当于所有异步任务串行可能会耗费很多时间，失去了多线程的意义
         */

        // 多任务组合方式2：使用CompletableFuture.allOf()方法组合
        CompletableFuture<Void> allThread = CompletableFuture.allOf(future01, future02, futureAttr, futureImage);
        // allThread.join();
        allThread.get(); // 等待所有结果完成
        System.out.println("所有异步任务都完成");
        /*
        执行结果：
            任务1线程：pool-1-thread-1
            执行结果：5
            任务1线程结束
            任务2线程：pool-1-thread-2
            任务2线程结束
            查询图片地址的线程3：pool-1-thread-3
            查询图片属性的线4：pool-1-thread-4
            所有异步任务都完成
         */
    }
}
